package org.zero.concurrency.demo.example.singleton;

import lombok.Getter;
import org.zero.concurrency.demo.annotations.Recommend;
import org.zero.concurrency.demo.annotations.ThreadSafe;

/**
 * 使用枚举类实现的单例模式-线程最为安全
 * 实例在第一次使用的时候创建
 *
 * @author 01
 */
@Recommend
@ThreadSafe
public class SingletonExample7 {
    /**
     * 私有构造函数
     */
    private SingletonExample7() {
    }

    /**
     * 静态工厂方法-获取实例
     *
     * @return instance
     */
    public static SingletonExample7 getInstance() {
        return Singleton.INSTANCE.getInstance();
    }

    /**
     * 由枚举类创建单例对象
     */
    @Getter
    private enum Singleton {
        INSTANCE;

        /**
         * 单例对象
         */
        private SingletonExample7 instance;

        /**
         * JVM保证这个方法绝对只调用一次
         */
        Singleton() {
            instance = new SingletonExample7();
        }
    }
}
